package thread3;

//单例模式
//饿汉模式
class SingletonDataSource {
    private static SingletonDataSource instance = new SingletonDataSource();

    //外面的类无法调用该类的构造方法（别的类无法创建实例了）
    private SingletonDataSource() {

    }

    //一方面把程序中要用到的实例准备好
    //一方面把外部构造实例的口子给封上

    //留下一个通道，让外界能访问到 instance 这个唯一对象 （外界访问该实例的唯一通道）
    public static SingletonDataSource getInstance() {
        return instance;
    }
}

//懒汉模式
//和饿汉模式相比，懒汉模式，主要的差别就在于这个实例的创建时机不同了，不在是类加载的时候就立即创建实例
//而是在首次调用到getInstance的时候，才会真正创建实例
class SingletonDataSource2 {
    private volatile static SingletonDataSource2 instance = null;

    private SingletonDataSource2() {

    }

    public static SingletonDataSource2 getInstance() {
        if (instance == null) {
            synchronized (SingletonDataSource2.class) {
                if (instance == null) {
                    instance = new SingletonDataSource2();
                }
            }
        }
        return instance;
    }
}


public class Test9 {
    public static void main(String[] args) {
        //无论在代码中的哪个地方来调用这里的getInstance得到的都是同一个实例
        SingletonDataSource dataSource = SingletonDataSource.getInstance();
    }
}
